﻿using Fuyao.Business.Entities.Models;
using Fuyao.Business.Logic.BC;
using Fuyao.Win.UI.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Fuyao.Win.UI.Mantenimientos;
using Fuyao.Win.UI.Util;
using Fuyao.Win.UI.Reportes;

namespace Fuyao.Win.UI.Ventas
{

    public partial class frmVentas : Form
    {
        BusinessLogic bc = new BusinessLogic();
        Venta beVenta;
        Parametro oParametroIGV;
        private int tipoVentaID;
        public string NroComprobanteVenta { get; set; }
        public string NroSerieComprobanteVenta { get; set; }

        Parametro oParametroSerieFactura;
        Parametro oParametroNumeroFactura;
        Parametro oParametroSerieBoleta;
        Parametro oParametroNumeroBoleta;

        #region Properties
        public int? VentaID { get; set; }
        public bool action { get; set; }
        #endregion

        public frmVentas(int tipoVentaID)
        {
            InitializeComponent();
            this.tipoVentaID = tipoVentaID;
        }

        private void loadUI()
        {
            loadDefaultInformation();

            if (VentaID == null)
                newVenta();
            else
                editVenta();
        }

        private void loadDefaultInformation()
        {
            action = false;
            recuperaSerieNroFactura();
            oParametroIGV = bc.getParametroByNombre(Constantes.PARAMETRO_IGV);
            lblCreadoPor.Text = VariablesGlobales.GlobalEnUsuario.Nombre + " " + VariablesGlobales.GlobalEnUsuario.ApellidoPaterno;
            lblIGV.Text = oParametroIGV.Valor;

            Utilitarios.cargarCboVendedores(this.cboVendedor);
            Utilitarios.cargarCboEstadosParametrosTable(this.cboEstadoFactura, Constantes.PARAMETRO_Factura);
            Utilitarios.cargarCboEstadosParametrosTable(this.cboFormaPago, Constantes.PARAMETRO_FormaPago);
            Utilitarios.cargarCboFacturaTipoMoneda(this.cboMoneda);
            cboEstadoFactura.SelectedValue = Constantes.FACTURA_PENDIENTE.ToString();
            cboTipoDocumento.SelectedIndex = this.tipoVentaID;
            cboMoneda.SelectedValue = Constantes.VENTA_MONEDA_SOLES_ID.ToString();
            dtpFechaEmision.Value = DateTime.Now;
            dtpFechaPago.Checked = false;
        }

        private void recuperaSerieNroFactura()
        {
            oParametroSerieFactura = bc.getParametroByNombre(Constantes.PARAMETRO_SerieFactura);
            oParametroNumeroFactura = bc.getParametroByNombre(Constantes.PARAMETRO_NumeroFactura);
            txtSerie.Text = oParametroSerieFactura.Valor;
            txtNroDocumento.Text = String.Format("{0:000000}", Convert.ToInt32(oParametroNumeroFactura.Valor));
        }

        private void recuperaSerieNroBoleta()
        {
            oParametroSerieBoleta = bc.getParametroByNombre(Constantes.PARAMETRO_SerieBoleta);
            oParametroNumeroBoleta = bc.getParametroByNombre(Constantes.PARAMETRO_NumeroBoleta);
            txtSerie.Text = oParametroSerieBoleta.Valor;
            txtNroDocumento.Text = String.Format("{0:000000}", Convert.ToInt32(oParametroNumeroBoleta.Valor));
        }

        private void setColumnasGrilla()
        {
            colProducto.DataPropertyName = "CodigoProducto";
            colDescripcion.DataPropertyName = "DescripcionProducto";
            colCantidad.DataPropertyName = "Cantidad";
            colPrecio.DataPropertyName = "PrecioUnitario";
            colDescuento.DataPropertyName = "Descuento";
            colImporte.DataPropertyName = "Importe";
        }

        private void newVenta()
        {
            cboTipoDocumento.SelectedValue = this.tipoVentaID;
            beVenta = new Venta();
            beVenta.DetalleVentas = new List<DetalleVenta>();
            beVenta.Pedido = new Pedido();
            beVenta.Estado = Constantes.FACTURA_PENDIENTE;
            beVenta.CreadoPor = 1;
            beVenta.TipoVenta = getTipoVenta();
            setPosicionbtnImprimir();
        }

        private void editVenta()
        {
            beVenta = bc.getVentaByID(VentaID);
            cargarDatosVenta(ref beVenta);
            deshabilitaControles(false);
        }
        private void mostrarIGV(bool _val)
        {
            lblIGV.Visible = _val;
            lblIGVLabel.Visible = _val;  
            txtIGV.Visible = _val;
        }

        private void cargarDatosVenta(ref Venta beVenta)
        {
            if (beVenta.TipoVenta == Constantes.VENTA_BOLETA_CODE)
            {
                txtRucDniCliente.Text = beVenta.Cliente.DNI;
                mostrarIGV(false);
            }
            else
                txtRucDniCliente.Text = beVenta.Cliente.RUC;

            txtRazonSocial.Text = beVenta.Cliente.NombreCliente;
            txtDireccion.Text = beVenta.Cliente.Direccion;
            txtNroDocumento.Text = beVenta.NroVenta.ToString();
            txtSerie.Text = beVenta.Serie;
            txtObservaciones.Text = beVenta.Observaciones;
            txtDescuento.Text = beVenta.Descuento.ToString();
            txtMontoTotal.Text = beVenta.MontoTotal.ToString();
            txtNroPedido.Text = String.Format("{0:000000}", beVenta.Pedido.NroPedido);
            txtNroDocumento.Text = String.Format("{0:000000}", beVenta.NroVenta);
            if (beVenta.GuiaRemision != null) txtGuiaRemision.Text = String.Format("{0:000000}", beVenta.GuiaRemision.NroGuiaRemision);            
            if (beVenta.Usuario != null)
                lblCreadoPor.Text = beVenta.Usuario.Nombre + " " + beVenta.Usuario.ApellidoPaterno;
            else
                lblCreadoPor.Text = VariablesGlobales.GlobalEnUsuario.Nombre + " " + VariablesGlobales.GlobalEnUsuario.ApellidoPaterno;
            lblIGV.Text = beVenta.IGV.ToString();
            if (beVenta.FechaPago != null)
            {
                dtpFechaPago.Checked = true;
                dtpFechaPago.Value = Convert.ToDateTime(beVenta.FechaPago);
            }
            if (beVenta.TipoVenta == Constantes.VENTA_BOLETA_CODE)
                cboTipoDocumento.SelectedIndex = Constantes.VENTA_BOLETA_ID;
            else
                cboTipoDocumento.SelectedIndex = Constantes.VENTA_FACTURA_ID;
            cboEstadoFactura.SelectedValue = beVenta.Estado.ToString();
            cboFormaPago.SelectedValue = beVenta.FormaPago.ToString();
            cboMoneda.SelectedValue = beVenta.TipoMoneda.ToString();
            cboVendedor.SelectedValue = beVenta.VendedorID;
            CalculateTotals();
            dgvDetalles.DataSource = null;
            dgvDetalles.DataSource = beVenta.DetalleVentas;
        }

        private string getTipoVenta()
        {
            return this.tipoVentaID == Constantes.VENTA_FACTURA_ID ? Constantes.VENTA_FACTURA_CODE : Constantes.VENTA_BOLETA_CODE;
        }

        private void frmVentas_Load(object sender, EventArgs e)
        {
            Utilitarios.configurarGrilla(ref dgvDetalles);
            setColumnasGrilla();
            loadUI();
        }

        private void dgvDetalles_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            if (e.ColumnIndex == colProducto.Index || e.ColumnIndex == colDescripcion.Index || e.ColumnIndex == colImporte.Index)
                e.Cancel = true;
        }

        private void dgvDetalles_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && e.ColumnIndex == colDelete.Index && dgvDetalles.CurrentRow.DataBoundItem != null)
            {
                if (MessageBox.Show("Está seguro de borrar este detalle?", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.YesNo,
                  MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                {
                    beVenta.DetalleVentas.Remove((DetalleVenta)dgvDetalles.CurrentRow.DataBoundItem);
                    dgvDetalles.DataSource = null;
                    dgvDetalles.DataSource = beVenta.DetalleVentas;
                }
            }
        }

        private void dgvDetalles_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (VariablesGlobales.IsDataGridViewCellDirty)
                {
                    DetalleVenta oDetalleVenta = (DetalleVenta)dgvDetalles.CurrentRow.DataBoundItem;
                    if (e.ColumnIndex == colCantidad.Index || e.ColumnIndex == colPrecio.Index || e.ColumnIndex == colDescuento.Index)
                    {
                        int cantidad = Convert.ToInt32(Utilitarios.IsNumericWithReturnValue(oDetalleVenta.Cantidad));
                        decimal precio = Convert.ToDecimal(Utilitarios.IsNumericWithReturnValue(oDetalleVenta.PrecioUnitario));
                        decimal descuento = Convert.ToDecimal(Utilitarios.IsNumericWithReturnValue(oDetalleVenta.Descuento));

                        oDetalleVenta.Importe = Convert.ToDecimal((cantidad * precio) - descuento);
                        dgvDetalles.CurrentRow.Cells[colImporte.Index].Value = oDetalleVenta.Importe;
                        dgvDetalles.CurrentCell = dgvDetalles.CurrentRow.Cells[colImporte.Index];
                        dgvDetalles.CurrentCell = dgvDetalles.CurrentRow.Cells[e.ColumnIndex + 1];
                    }
                }
            }
            catch (Exception) { }
            finally
            {
                CalculateTotals();
            }
        }

        private void CalculateTotals()
        {
            decimal totalDescuentoGrilla = 0;
            decimal subTotal = 0;
            decimal descuento = Convert.ToDecimal(Utilitarios.IsNumericWithReturnValue(txtDescuento.Text));
            decimal totalBruto = 0;
            decimal igv = Convert.ToDecimal(Utilitarios.IsNumericWithReturnValue(lblIGV.Text));

            foreach (DetalleVenta oDetalleVenta in beVenta.DetalleVentas)
            {
                subTotal += oDetalleVenta.Importe;
                totalDescuentoGrilla += Convert.ToDecimal(Utilitarios.IsNumericWithReturnValue(oDetalleVenta.Descuento));
            }

            totalBruto = subTotal - descuento;
            txtTotalDescuentoGrilla.Text = Convert.ToString(totalDescuentoGrilla);
            txtTotalBruto.Text = Convert.ToString(totalBruto);
            txtDescuento.Text = Convert.ToString(descuento);

            decimal igvFormula = (Convert.ToDecimal(subTotal) / Convert.ToDecimal(1.18)) * Convert.ToDecimal(0.18);
            decimal subtotal = Convert.ToDecimal(subTotal) / Convert.ToDecimal(1.18);

            txtIGV.Text = igvFormula.ToString("N2");  
            txtSubtotal.Text = (subtotal - descuento).ToString("N2"); 
            txtMontoTotal.Text = (subtotal + igvFormula).ToString("N2");

        }

        private void dgvDetalles_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            if (dgvDetalles.IsCurrentCellDirty)
            {
                if (e.ColumnIndex == colCantidad.Index || e.ColumnIndex == colPrecio.Index || e.ColumnIndex == colDescuento.Index)
                {
                    if (!Utilitarios.IsNumeric(e.FormattedValue))
                    {
                        MessageBox.Show("Ingrese una dato válido o presion ESC", "Sistema FUYAO - Mensaje de Validación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        e.Cancel = true;
                    }
                }
                VariablesGlobales.IsDataGridViewCellDirty = true;
            }
            else
                VariablesGlobales.IsDataGridViewCellDirty = false;
        }

        private void btnAddProduct_Click(object sender, EventArgs e)
        {
            if (beVenta.Pedido.NroPedido == null)
            {
                  MessageBox.Show("Tiene que ingresar el nro de pedido antes de continuar", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                  txtNroPedido.Focus();
                  return;
            }

            frmSelectOrderDetail frm = new frmSelectOrderDetail(Convert.ToString(beVenta.Pedido.NroPedido),this.tipoVentaID);
            frm.ListDetalleVentaToReceive = beVenta.DetalleVentas;
            frm.ShowDialog();

            if (frm.ListDetalleVentaToReturn != null)
            {
                if (frm.ListDetalleVentaToReturn.Count == 0)
                {
                    beVenta.DetalleVentas = new List<DetalleVenta>();
                }

                beVenta.DetalleVentas = frm.ListDetalleVentaToReturn;
                dgvDetalles.DataSource = null;
                dgvDetalles.DataSource = beVenta.DetalleVentas;
            }

            CalculateTotals();

        }

        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            Cliente oCliente;

            if (beVenta.TipoVenta == Constantes.VENTA_BOLETA_CODE)
                oCliente = bc.getClienteByField("DNI", txtRucDniCliente.Text);
            else
                oCliente = bc.getClienteByField("RUC", txtRucDniCliente.Text);

            if (oCliente == null)
            {
                if (MessageBox.Show("Cliente no existe. Desea crearlo?", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.YesNo,
                    MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                {
                    frmClientes frm = new frmClientes();
                    frm.ShowDialog();
                    if (frm.action)
                    {
                        oCliente = bc.getClienteByField("ClienteID", Convert.ToString(frm.ClienteID));
                        LlenarCliente(ref oCliente);
                    }
                }
                else
                    MessageBox.Show("Nuevo cliente se guardara al finalizar la transacción", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                LlenarCliente(ref oCliente);
            }

        }

        private void LlenarCliente(ref Cliente oCliente)
        {
            if (this.tipoVentaID == Constantes.VENTA_FACTURA_ID)
                txtRucDniCliente.Text = oCliente.RUC;
            else
                txtRucDniCliente.Text = oCliente.DNI;

            txtRazonSocial.Text = oCliente.NombreCliente;
            txtDireccion.Text = oCliente.Direccion;
            cboVendedor.SelectedValue = oCliente.VendedorID;
            beVenta.ClienteID = oCliente.ClienteID;
        }

        private void registrarDatos()
        {
            beVenta.TipoVenta = getTipoVenta();
            beVenta.TipoMoneda = Convert.ToInt16(cboMoneda.SelectedValue);
            beVenta.Estado = Convert.ToInt16(cboEstadoFactura.SelectedValue);
            beVenta.FormaPago = Convert.ToInt16(cboFormaPago.SelectedValue);
            beVenta.NroVenta = Convert.ToInt32(txtNroDocumento.Text);
            beVenta.Serie = txtSerie.Text;
            beVenta.Observaciones = txtObservaciones.Text;
            beVenta.VendedorID = Convert.ToInt16(cboVendedor.SelectedValue);
            beVenta.Descuento = Convert.ToDecimal(Utilitarios.IsNumericWithReturnValue(txtDescuento.Text));
            beVenta.MontoTotal = Convert.ToDecimal(Utilitarios.IsNumericWithReturnValue(txtMontoTotal.Text));
            beVenta.CreadoPor = VariablesGlobales.GlobalEnUsuario.UsuarioID;
            beVenta.IGV = Convert.ToDecimal(Utilitarios.IsNumericWithReturnValue(lblIGV.Text));

            if (dtpFechaPago.Checked)
                beVenta.FechaPago = dtpFechaPago.Value;
            else
                beVenta.FechaPago = null;
            NroComprobanteVenta = this.txtNroDocumento.Text;
            NroSerieComprobanteVenta = this.txtSerie.Text;

            if (bc.validarNroDocumento(beVenta))
            {
                MessageBox.Show("El nro de comprobante ya fue ingresado al sistema. Ingrese otro número.", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtNroDocumento.Focus();
                return;
            }
            bool result = bc.InsertarActualizarVenta(beVenta);

            if (result)
            {
                string str = string.Empty;
                if (VentaID != null)
                    str = "Se actualizaron los datos correctamente";
                else
                    str = "Se ingresaron los datos correctamente";

                MessageBox.Show(str, "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);

                if (beVenta.TipoVenta == Constantes.VENTA_FACTURA_CODE)
                    imprimirFactura();
                else
                    imprimirBoleta();
                cerrarForm();
            }
            else
                MessageBox.Show("Error al ingresar los datos, contacte con Sistemas", "Sistema FUYAO - Mensaje de Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }

        private void cerrarForm()
        {
            this.Close();
            action = true;
        }

        private void imprimirFactura()
        {
            rptFactura rpt = new rptFactura();
            DataTable dt = (DataTable)(new Fuyao.Win.UI.Reportes.dsReportesTableAdapters.VentaTableAdapter().GetVentaByVentaID_TipoVenta(Convert.ToInt32(beVenta.NroVenta), beVenta.TipoVenta));
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            rpt.Subreports[0].SetDataSource(ds);
            rpt.SetDataSource(ds);
            frmReportViewer frm = new frmReportViewer(rpt);
            frm.ShowDialog();
        }

        private void imprimirBoleta()
        {
            rptBoleta rpt = new rptBoleta();
            DataTable dt = (DataTable)(new Fuyao.Win.UI.Reportes.dsReportesTableAdapters.VentaTableAdapter().GetVentaByVentaID_TipoVenta(Convert.ToInt32(beVenta.NroVenta), beVenta.TipoVenta));
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            rpt.Subreports[0].SetDataSource(ds);
            rpt.SetDataSource(ds);
            frmReportViewer frm = new frmReportViewer(rpt);
            frm.ShowDialog();
        }

        private bool validarCamposRequeridos()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Ingrese los campos requeridos: " + System.Environment.NewLine);

            bool isValid = true;

            if (String.IsNullOrEmpty(txtNroDocumento.Text) || txtNroDocumento.Text.Trim() == "0")
            {
                sb.Append("- Nro de Documento" + System.Environment.NewLine);
                ErrorProv.SetError(txtNroDocumento, "Ingrese el nro de documento");
                isValid = false;
            }

            if (String.IsNullOrEmpty(txtRucDniCliente.Text))
            {
                sb.Append("- RUC/DNI" + System.Environment.NewLine);
                ErrorProv.SetError(txtRucDniCliente, "Ingrese nro de RUC/DNI del cliente ");
                txtRucDniCliente.ReadOnly = false;
                isValid = false;
            }

            if (String.IsNullOrEmpty(txtRazonSocial.Text))
            {
                sb.Append("- Razón social" + System.Environment.NewLine);
                ErrorProv.SetError(txtRazonSocial, "Ingrese la razón social");
                isValid = false;
            }

            if (cboVendedor.SelectedIndex == 0 || cboVendedor.SelectedIndex == -1)
            {
                sb.Append("- Seleccione vendedor" + System.Environment.NewLine);
                ErrorProv.SetError(cboVendedor, "Seleccione el vendedor del cliente");
                isValid = false;
            }

            if (cboEstadoFactura.SelectedIndex == -1)
            {
                sb.Append("- Seleccione Estado" + System.Environment.NewLine);
                ErrorProv.SetError(cboEstadoFactura, "Seleccione el estado del doc");
                isValid = false;
            }

            if (beVenta.DetalleVentas.Count == 0)
            {
                sb.Append("- Ingrese al menos 1 detalle" + System.Environment.NewLine);
                isValid = false;
            }

            if (!isValid)
                MessageBox.Show(sb.ToString(), "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

            return isValid;
        }


        private void txtDescuento_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.vSoloNumeros(e);
        }

        private void txtDescuento_KeyDown(object sender, KeyEventArgs e)
        {
            CalculateTotals();
        }

        private void txtDescuento_Leave(object sender, EventArgs e)
        {
            CalculateTotals();
        }

        private void cbo_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComboBox cbo = (ComboBox)sender;
            ErrorProv.SetError(cbo, "");
        }
        private void txt_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            ErrorProv.SetError(tbx, "");
        }

        private void cboTipoDocumento_SelectedIndexChanged(object sender, EventArgs e)
        {
            tipoVentaID = Convert.ToInt32(cboTipoDocumento.SelectedIndex);
            if (tipoVentaID == 0)
            {
                recuperaSerieNroFactura();
                mostrarIGV(true);
            }
            else
            {
                recuperaSerieNroBoleta();
                mostrarIGV(false);
            }
        }

        private void btnNroPedido_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(txtNroPedido.Text.Trim()))
            {
                cargarVenta_desde_Pedido();
            }
            else
            {
                MessageBox.Show("El # de pedido no es válido", "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }

        }

        private void cargarVenta_desde_Pedido()
        {
            Pedido bePedido = bc.getGuiaInternaByNroPedido(txtNroPedido.Text.Trim());

            if (bePedido == null)
            {
                MessageBox.Show("El # de pedido no es existe", "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                this.txtNroPedido.SelectAll();
                return;
            }

            if (bePedido.Estado == Constantes.GUIAINTERNA_ANULADO)
            {
                MessageBox.Show("El # de pedido ingresado ha sido anulado", "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                this.txtNroPedido.SelectAll();
                return;
            }

            beVenta = new Venta();
            beVenta.DetalleVentas = new List<DetalleVenta>();
            beVenta.Pedido = new Pedido();
            beVenta.Cliente = new Cliente();

            beVenta.TipoVenta = getTipoVenta();
            beVenta.ClienteID = bePedido.ClienteID;
            beVenta.VendedorID = Convert.ToInt32(bePedido.Cliente.VendedorID);
            beVenta.Cliente.RUC = bePedido.Cliente.RUC;
            beVenta.Cliente.DNI = bePedido.Cliente.DNI;
            beVenta.Cliente.NombreCliente = bePedido.Cliente.NombreCliente;
            beVenta.Cliente.Direccion = bePedido.Cliente.DireccionDesc;
            beVenta.Observaciones = bePedido.Observacion;
            beVenta.Serie = txtSerie.Text;
            beVenta.Pedido.NroPedido = bePedido.NroPedido;
            beVenta.PedidoID = bePedido.PedidoID;
            beVenta.TipoMoneda = Convert.ToInt32(cboMoneda.SelectedValue);
            beVenta.Estado = Convert.ToInt32(cboEstadoFactura.SelectedValue);
            beVenta.FormaPago = Convert.ToInt32(cboFormaPago.SelectedValue);
            beVenta.IGV = Convert.ToDecimal(oParametroIGV.Valor);
            beVenta.Serie = this.txtSerie.Text.Trim();
            beVenta.NroVenta = Convert.ToInt32(this.txtNroDocumento.Text.Trim());

            cargarDatosVenta(ref beVenta);
        }

        private void btnRefresh_Click(object sender, EventArgs e)
        {
            CalculateTotals();
        }

        private void txtNroPedido_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar) || e.KeyChar == Convert.ToChar(Keys.Enter)) e.Handled = false;
            else e.Handled = true;
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                if (!string.IsNullOrEmpty(txtNroPedido.Text.Trim()))
                {
                    cargarVenta_desde_Pedido();
                }
                else
                {
                    MessageBox.Show("El # de pedido no es válido", "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }

        private void setPosicionbtnImprimir()
        {
            this.btnAddProduct.Location = new System.Drawing.Point(720, 40);
            this.btnImprimirDatos.Location = new System.Drawing.Point(815, 40);
        }

        private void setNewPosicionbtnImprimir()
        {
            this.btnAddProduct.Location = new System.Drawing.Point(678, 40);
            this.btnImprimirDatos.Location = new System.Drawing.Point(773, 40);
        }

        private void deshabilitaControles(bool _val)
        {
            this.cboVendedor.Enabled = _val;
            this.cboMoneda.Enabled = _val;
            this.cboTipoDocumento.Enabled = _val;
            this.txtNroPedido.ReadOnly = !_val;
            this.txtNroPedido.BackColor = Color.White;
            this.btnGrabar.Visible = !_val;
            this.btnAddProduct.Visible = _val;
            //setNewPosicionbtnImprimir();
            this.btnImprimirDatos.Location = new System.Drawing.Point(720, 40);
            this.btnGrabar.Location = new System.Drawing.Point(815, 40);
        }

        private void btnImprimirDatos_Click(object sender, EventArgs e)
        {
            if (VentaID > 0)
            {
                if (this.cboTipoDocumento.SelectedIndex == 0) imprimirFactura();
                else imprimirBoleta();
            }
            else
                if (validarCamposRequeridos()) registrarDatos();
        }

        private void btnGrabar_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Ingrese los campos requeridos: " + System.Environment.NewLine);

            bool isValid = true;

            if (dtpFechaPago.Checked && Convert.ToInt32(cboEstadoFactura.SelectedValue) == Constantes.FACTURA_PENDIENTE)
            {
                ErrorProv.SetError(this.cboEstadoFactura, "El estado del documento debe ser Pagado");
                sb.Append("- Nuevo estado del documento" + System.Environment.NewLine);
                isValid = false;
            }
            else if (Convert.ToInt32(cboEstadoFactura.SelectedValue) == Constantes.FACTURA_PAGADA && !dtpFechaPago.Checked)
            {
                ErrorProv.SetError(this.dtpFechaPago, "Seleccione la fecha de pago");
                sb.Append("- Fecha de pago" + System.Environment.NewLine);
                isValid = false;
            }

            if (!isValid)
                MessageBox.Show(sb.ToString(), "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            else registrarDatos();
        }

        private void dtpFechaPago_ValueChanged(object sender, EventArgs e)
        {
            ErrorProv.SetError(this.dtpFechaPago, "");
        }

        private void txtRucDniCliente_Leave(object sender, EventArgs e)
        {
            if (beVenta.Cliente != null)
            {
                if (txtRucDniCliente.Text != beVenta.Cliente.RUC || txtRucDniCliente.Text != beVenta.Cliente.DNI)
                {
                    if (!string.IsNullOrEmpty(txtRucDniCliente.Text))
                    {
                        if (getTipoVenta() == Constantes.VENTA_FACTURA_CODE)
                        {
                            beVenta.Cliente.RUC = txtRucDniCliente.Text;
                            beVenta.Cliente.ClienteID = beVenta.ClienteID;
                            bc.UpdateClienteRUC(beVenta.Cliente);
                        }
                        else
                        {
                            beVenta.Cliente.DNI = txtRucDniCliente.Text;
                            beVenta.Cliente.ClienteID = beVenta.ClienteID;
                            bc.UpdateClienteDNI(beVenta.Cliente);
                        }
                    }
                }
            }
            else
            {                
                MessageBox.Show("Ingrese # pedido antes de continuar. ", "Sistema FUYAO - Mensaje de Validación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtRucDniCliente.Text = string.Empty;
                txtDireccion.Text = string.Empty;
                txtRazonSocial.Text = string.Empty;
                //txtNroPedido.Focus();
            }
        }

        private void frmVentas_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.cerrarFormularioEscape(e, this);
        }

        private void txt_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.vSoloNumeros(e);
        }

        private void txtGuiaRemision_Leave(object sender, EventArgs e)
        {
            validarGuiaRemision();
        }

        private void validarGuiaRemision() 
        {

            if (!string.IsNullOrEmpty(txtGuiaRemision.Text))
            {
                beVenta.GuiaRemision = bc.getGuiaRemisionByNroGuiaRemision(Convert.ToInt32(Utilitarios.IsNumericWithReturnValue(txtGuiaRemision.Text)));

                if (beVenta.GuiaRemision == null)
                {
                    MessageBox.Show("La guia de remisión ingresada no existe.", "Sistema FUYAO - Mensaje de Validación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    txtGuiaRemision.Text = string.Empty;
                }
                else
                {
                    beVenta.GuiaRemisionID = beVenta.GuiaRemision.GuiaRemisionID;
                    txtGuiaRemision.Text = String.Format("{0:000000}", beVenta.GuiaRemision.NroGuiaRemision);
                }

            }
        }

        private void txtRucDniCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.vSoloNumeros(e);
        }

        private void txtGuiaRemision_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                validarGuiaRemision();
            }
        }

        private void txtNroDocumento_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar) || e.KeyChar == Convert.ToChar(Keys.Enter)) e.Handled = false;
            else e.Handled = true;
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                if (!string.IsNullOrEmpty(txtNroDocumento.Text.Trim()))
                {
                    beVenta.NroVenta = Convert.ToInt32(txtNroDocumento.Text);
                    txtNroDocumento.Text = String.Format("{0:000000}", beVenta.NroVenta);
                }
                else
                {
                    MessageBox.Show("El # de documento no es válido", "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }

        private void txtNroDocumento_Leave(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            if (string.IsNullOrEmpty(tbx.Text))
            {
                if (tipoVentaID == 0)
                {
                    recuperaSerieNroFactura();
                }
                else
                {
                    recuperaSerieNroBoleta();
                }
            }
        }
    }
}
